home *** CD-ROM | disk | FTP | other *** search
/ El Mac 9 / El Mac 9.iso / Shareware / Applications / MathPad 2.4 / XFuns / XFun kit / slider src / sliders.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-27  |  4.1 KB  |  192 lines  |  [TEXT/CWIE]

  1. /*  An XFun to create slider bar controls. 
  2.  
  3. This is not a particularly good choice for an XFun source example because it contains
  4. complications unrelated to the XFun interface. It does, however, show some tricks used
  5. to manage interaction with MathPad. Also, it provides full source for an XFun that I
  6. suspect others may want to modify.
  7.  
  8. */
  9.  
  10. #include "callbackg.h"
  11. #include "sliders.h"
  12.  
  13. SliderPtr sliders;            // list of all sliders
  14. ControlActionUPP scroller;    // universal proc ptr for PowerPC compatability
  15.  
  16. static SliderPtr NewSlider(char *name)
  17. {
  18.    Rect BarRect;
  19.    SliderPtr slider;
  20.    int top,left,len;
  21.    unsigned char title[64],*dst;
  22.    Point org = { 0,0 };
  23.    WindowPtr wind,twind;
  24.    GrafPtr oldport;
  25.    
  26.    twind = FrontWindow();    // normally text window is front during eval
  27.    GetPort(&oldport);
  28.    if(sliders)                // put new slider under the last slider
  29.    {
  30.     SetPort(sliders->wind);
  31.     LocalToGlobal(&org);
  32.     top  = org.v + 36;
  33.     left = org.h;
  34.    }
  35.    else                        // put 1st slider under text window
  36.    {
  37.     SetPort(twind);
  38.     org.v = twind->portRect.bottom;
  39.     LocalToGlobal(&org);
  40.     top  = org.v + 20;
  41.     left = org.h;
  42.    }
  43.    SetPort(oldport);
  44.    
  45.    slider = (SliderPtr)NewPtr(sizeof(struct sliderinfo));
  46.    if(!slider) return(NULL);
  47.    
  48.    dst = &title[1];
  49.    for(len=0; len<63; len++)
  50.      if((*dst++ = *name++) == 0) break;
  51.    title[0] = len;
  52.    
  53.    SetRect(&BarRect,left,top,left+216,top+16);
  54.    wind = NewWindow(NULL,&BarRect,title,0,noGrowDocProc,(WindowPtr)-1,TRUE,0L);
  55.    if(!wind) return(NULL);
  56.    
  57.    BarRect = wind->portRect;
  58.    slider->ctrl = NewControl(wind,&BarRect,0L,TRUE,500,0,1000,scrollBarProc,0L);
  59.    slider->next = sliders;
  60.    sliders = slider;
  61.    slider->wind = wind;
  62.    SelectWindow(twind);
  63.    return(slider); 
  64. }
  65.  
  66. static int matchname(char *name,unsigned char *title)
  67. {
  68.    int c,len;
  69.    len = *title++;
  70.    while((c=*name++) && c == *title++) len--;
  71.    return(c == 0 && len == 0);
  72. }
  73.  
  74. static SliderPtr FindSlider(char *name)
  75. {
  76.    Str255 title;
  77.    SliderPtr list;
  78.    list = sliders;
  79.    while(list)
  80.    {
  81.     GetWTitle(list->wind,title);
  82.     if(matchname(name,title)) return(list);
  83.     list = list->next;
  84.    }
  85.    return(NULL);
  86. }
  87.  
  88. /* --------------------------------------------------------- */
  89. void initialize(void)
  90. {    
  91.     sliders = 0L;
  92.     scroller = NewControlActionProc(ScrollProc);
  93. }
  94.  
  95. int IsSlider(WindowPtr theWindow)
  96. {
  97.    SliderPtr list;
  98.    list = sliders;
  99.    while(list)
  100.    {
  101.     if(list->wind == theWindow) return(TRUE);
  102.     list = list->next;
  103.    }
  104.    return(FALSE);
  105. }
  106.  
  107. void activate(void)
  108. {
  109.    SliderPtr list;
  110.    list = sliders;
  111.    while(list)
  112.    {
  113.     ShowControl(list->ctrl);
  114.     list = list->next;
  115.    }
  116. }
  117.  
  118. void deactivate(void)
  119. {
  120.    SliderPtr list;
  121.    list = sliders;
  122.    while(list)
  123.    {
  124.     HideControl(list->ctrl);
  125.     list = list->next;
  126.    }
  127. }
  128.  
  129. short dofuncall(double *retval)
  130. {
  131.    char *name;
  132.    double min,max;
  133.    SliderPtr slider;
  134.    WindowPtr wind;
  135.    char buf[10];
  136.  
  137.    if(!GetParmName(2,&name))
  138.    {
  139.     if(!GetParmVal(2,&min)) return(FALSE);    // can't get name. try number
  140.     Sprintf(buf,"c%0.3g",min);
  141.     name = buf;
  142.    }
  143.    if(!GetParmVal(1,&min)) return(FALSE);
  144.    if(!GetParmVal(0,&max)) return(FALSE);
  145.    slider = FindSlider(name);
  146.    if(!slider) slider = NewSlider(name);
  147.    if(!slider)
  148.    {
  149.     ErrMsg(" Not enough memory",0L);
  150.     return(FALSE);
  151.    }
  152.    wind = slider->wind;
  153.    ShowWindow(wind);
  154.    if(EmptyRgn(wind->visRgn)) SelectWindow(wind);    // if covered bring it to front
  155.    if(EmptyRgn(wind->visRgn)) MoveWindow(wind,250,42,FALSE);    // if off screen move it
  156.    
  157.    *retval = (max-min)*GetCtlValue(slider->ctrl)/1000.0 + min;
  158.    return(TRUE);
  159. }
  160.  
  161. void KillSlider(WindowPtr theWindow)
  162. {
  163.    SliderPtr list,prev;
  164.    list = sliders;
  165.    prev = NULL;
  166.    while(list)
  167.    {
  168.     if(list->wind == theWindow)
  169.     {
  170.      DisposeWindow(theWindow);
  171.      if(prev) prev->next = list->next;
  172.      else sliders = list->next;
  173.      DisposePtr((Ptr)list);
  174.      break;
  175.     }
  176.     prev = list;
  177.     list = list->next;
  178.    }
  179. }
  180.  
  181. void KillAllSliders(void)
  182. {
  183.    SliderPtr next;
  184.    while(sliders)
  185.    {
  186.     DisposeWindow(sliders->wind);
  187.     next = sliders->next;
  188.     DisposePtr((Ptr)sliders);
  189.     sliders = next;
  190.    }
  191. }
  192.